package com.delio.client.pagos.pagosueldos;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.delio.client.idioma.DelioConstants;
import com.delio.client.pagos.ingresos.PagoIngresos;
import com.delio.client.pagos.pagoadelantos.PagoAdelantos;
import com.delio.client.pagos.pagoadelantos.PanelNuevoPagoAdelanto;
import com.delio.client.pagos.tablasbasicas.Tipos;
import com.delio.client.util.RemoteStoreFilterField;
import com.delio.client.util.Utilities;
import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.Style.SelectionMode;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.event.DatePickerEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.GridEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.event.SelectionChangedListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.store.Store;
import com.extjs.gxt.ui.client.store.StoreEvent;
import com.extjs.gxt.ui.client.store.StoreListener;
import com.extjs.gxt.ui.client.util.IconHelper;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Label;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.form.DateField;
import com.extjs.gxt.ui.client.widget.grid.CheckBoxSelectionModel;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnData;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer;
import com.extjs.gxt.ui.client.widget.grid.filters.GridFilters;
import com.extjs.gxt.ui.client.widget.grid.filters.StringFilter;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.toolbar.PagingToolBar;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Element;

public class PanelGridPagoSueldo extends ContentPanel {
	private DelioConstants k = GWT.create(DelioConstants.class);

	private ToolBar toolbar;
	private PagingToolBar toolBarPag;

	private List<ColumnConfig> columns;
	private CheckBoxSelectionModel<BeanModel> sm;
	private ColumnModel cm;
	public static Grid<BeanModel> grid;

	private BeanModel selectedModel;
	@SuppressWarnings("unused")
	private List<BeanModel> selectedModels;
	private Integer selectedSize;

	private ComboBox<BeanModel> cmbTipocontrato;
	private ComboBox<BeanModel> cmbEstadopago;
	private DateField fecha;

	private GridFilters filters;
	@SuppressWarnings("unused")
	private String text = null;
	private RemoteStoreFilterField<BeanModel> filterField;

	public static PanelNuevoPagoAdelanto panelnuevopagoadelanto;
	public static PanelNuevoPagoSueldo panelnuevopagosueldo;
	
	
	
	@Override
	protected void onRender(Element parent, int pos) {
		
		super.onRender(parent, pos);
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public PanelGridPagoSueldo() {
		super();
		setBodyBorder(false);
		setHeaderVisible(false);
		setIcon(IconHelper.createPath("images/icons/table.png"));
		setHeading(k.ListaEmpleados());
		setLayout(new FitLayout());

		Tipos.getList("listEstadoPagos");
		Tipos.loader.load();

		cmbEstadopago = new ComboBox<BeanModel>();
		cmbEstadopago.setEmptyText(k.comboempty());
		cmbEstadopago.setEditable(false);
		cmbEstadopago.setDisplayField("tipo");
		cmbEstadopago.setValueField("tipo");
		cmbEstadopago.setStore(Tipos.store);
		cmbEstadopago.setTriggerAction(TriggerAction.ALL);
		cmbEstadopago.setValueField("tipo");
		cmbEstadopago.setUseQueryCache(false);
		cmbEstadopago
				.addSelectionChangedListener(new SelectionChangedListener<BeanModel>() {

					@Override
					public void selectionChanged(
							SelectionChangedEvent<BeanModel> se) {
						Integer id = se.getSelectedItem().get("id");
						PagoSueldos.estadopago_id = id;
						PagoSueldos.loader.load();

					}
				});

		cmbEstadopago.getStore().addStoreListener(
				new StoreListener<BeanModel>() {
					@Override
					public void storeDataChanged(StoreEvent<BeanModel> se) {
						super.storeDataChanged(se);
						List<BeanModel> list = new ArrayList<BeanModel>();
						list.add(cmbEstadopago. getStore().getAt(0));
					//	cmbEstadopago.setSelection(list);
					}
				});

	
		Tipos.getList("listTipoContratos");
		Tipos.loader.load();
		cmbTipocontrato = new ComboBox<BeanModel>();
		cmbTipocontrato.setEmptyText(k.comboempty());
		cmbTipocontrato.setEditable(false);
		cmbTipocontrato.setDisplayField("tipo");
		cmbTipocontrato.setValueField("tipo");
		cmbTipocontrato.setStore(Tipos.store);
		cmbTipocontrato.setTriggerAction(TriggerAction.ALL);
		cmbTipocontrato.setValueField("tipo");
		cmbTipocontrato.setUseQueryCache(false);
		cmbTipocontrato
				.addSelectionChangedListener(new SelectionChangedListener<BeanModel>() {

					@Override
					public void selectionChanged(
							SelectionChangedEvent<BeanModel> se) {
						Integer id = se.getSelectedItem().get("id");
						PagoSueldos.tipocontrato_id = id;
						PagoSueldos.loader.load();

					}
				});

		
		
		PagoSueldos.getPaginate();
		PagoSueldos.loader.load();

		toolbar = new ToolBar();
		toolbar.setStyleAttribute("backgroundImage","url(gxt/images/default/panel/white-top-bottom.gif)");
		toolbar.setBorders(true);

		fecha = new DateField();
		fecha.setFieldLabel(k.fechapago());
		fecha.getPropertyEditor().setFormat(
				DateTimeFormat.getFormat("yyyy-MM-dd"));
		fecha.setValue(new Date());
		fecha.getDatePicker().addListener(Events.Select,
				new Listener<DatePickerEvent>() {

					public void handleEvent(DatePickerEvent be) {
						if (fecha.getValue().compareTo(new Date()) < 0) {
							DateTimeFormat fmt = DateTimeFormat
									.getFormat("yyyy-MM-dd");
							String d = fmt.format(fecha.getValue());
							String a = fmt.format(new Date());

							Date fechaActual = fmt.parse(a);
							Date fechaConsulta = fmt.parse(d);

							if (fechaConsulta.compareTo(fechaActual) == 0) {
								PagoSueldos.valor = true;
							

							} else {
								PagoSueldos.valor = false;

							}
							PagoSueldos.fecha = fechaConsulta;
							PagoSueldos.loader.load();
						} else
							PagoSueldos.store.removeAll();
					}

				});

		filters = new GridFilters();
		filters.addFilter(new StringFilter("empleado"));
		filters.addFilter(new StringFilter("sueldo"));
		filters.addFilter(new StringFilter("adelantos"));
		filters.addFilter(new StringFilter("aporte"));
		filters.addFilter(new StringFilter("tardanza"));
		filters.addFilter(new StringFilter("faltas"));
		filters.addFilter(new StringFilter("otros"));
		filters.addFilter(new StringFilter("horasextras"));
		filters.addFilter(new StringFilter("totalingreso"));
		filters.addFilter(new StringFilter("netopagar"));
		filters.addFilter(new StringFilter("estado"));
		filters.addFilter(new StringFilter("fecha"));
		filters.addFilter(new StringFilter("saldo"));
		filters.addFilter(new StringFilter("saldoanterior"));

		filterField = new RemoteStoreFilterField() {

			@Override
			protected void handleOnFilter(String filter) {
				if (filter == null || filter.equals(""))
					text = null;
				else
					text = filter.toLowerCase();
				PagoSueldos.filter = filter;
				PagoSueldos.loader.load();
			}

			@Override
			protected boolean doSelect(Store store, ModelData parent,
					ModelData record, String property, String filter) {
				String name = record.get("empleado");

				name = name.toLowerCase();

				if (name.startsWith(filter.toLowerCase())) {
					return true;
				}
				return false;
			}
		};
		filterField.bind(PagoSueldos.store);
		filterField.setWidth(250);
		filterField.setEmptyText(k.buscar());

		Label lblcontrata = new Label("Periodo:");
		lblcontrata.setStyleAttribute("marginLeft", "30px");
		lblcontrata.setStyleAttribute("marginRight", "10px");

		Label lblfecha = new Label("Fecha:");
		lblfecha.setStyleAttribute("marginLeft", "30px");
		lblfecha.setStyleAttribute("marginRight", "10px");

		Label lblestado = new Label("Estado:");
		lblestado.setStyleAttribute("marginLeft", "30px");
		lblestado.setStyleAttribute("marginRight", "10px");

		toolbar.add(filterField);
		toolbar.add(lblcontrata);
		toolbar.add(cmbTipocontrato);
		toolbar.add(lblestado);
		toolbar.add(cmbEstadopago);
		toolbar.add(lblfecha);
		toolbar.add(fecha);
		toolbar.add(Utilities.getLabel("Lista de Pago Sueldos", "180px"));

		toolBarPag = new PagingToolBar(Utilities.itemsPerPage);
		toolBarPag.bind(PagoSueldos.loader);
		toolBarPag.setBorders(true);

		columns = new ArrayList<ColumnConfig>();

		sm = new CheckBoxSelectionModel<BeanModel>();
		sm.setSelectionMode(SelectionMode.SINGLE);

		columns.add(sm.getColumn());
		columns.add(new ColumnConfig("empleado", k.empleado(), 100));
		columns.add(new ColumnConfig("sueldo", k.sueldo(), 100));
		columns.add(new ColumnConfig("extras", k.extras(), 100));
		columns.add(new ColumnConfig("otros", k.otros(), 100));

		columns.add(new ColumnConfig("aportes", k.aporte(), 100));
		columns.add(new ColumnConfig("tardanzas", k.tardanzas(), 100));
		columns.add(new ColumnConfig("faltas", k.faltas(), 100));

		columns.add(new ColumnConfig("total", k.total(), 100));
		columns.add(new ColumnConfig("neto", k.neto(), 100));
		columns.add(new ColumnConfig("adelantos", k.adelanto(), 100));
		// columns.add(new ColumnConfig("saldo", k.saldo(), 100));

		GridCellRenderer<BeanModel> saldo = new GridCellRenderer<BeanModel>() {
			@Override
			public Object render(BeanModel model, String property,
					ColumnData config, int rowIndex, int colIndex,
					ListStore<BeanModel> store, Grid<BeanModel> grid) {

				double val = (Double) model.get(property);

				String style = "";
				if (val >= 0.0)
					style = "blue";

				return "<span qtitle='"
						+ cm.getColumnById(property).getHeader() + "' qtip='"
						+ val + "' style='font-weight: bold;color:" + style
						+ "'>" + val + "</span>";
			}
		};

		ColumnConfig column = new ColumnConfig("saldo", k.saldo(), 80);
		column.setAlignment(HorizontalAlignment.RIGHT);
		column.setRenderer(saldo);

		columns.add(column);

		// fecha.getDatePicker().

		GridCellRenderer<BeanModel> saldoanterior = new GridCellRenderer<BeanModel>() {
			@Override
			public Object render(BeanModel model, String property,
					ColumnData config, int rowIndex, int colIndex,
					ListStore<BeanModel> store, Grid<BeanModel> grid) {

				double val = (Double) model.get(property);

				String style = "";
				if (val == 0.0)
					style = "blue";
				else if (val > 0.0)
					style = "red";
				else
					style = "black";

				return "<span qtitle='"
						+ cm.getColumnById(property).getHeader() + "' qtip='"
						+ val + "' style='font-weight: bold;color:" + style
						+ "'>" + val + "</span>";
			}
		};

		column = new ColumnConfig("saldoanterior", "Saldo anterior", 80);
		column.setAlignment(HorizontalAlignment.RIGHT);
		column.setRenderer(saldoanterior);

		columns.add(column);

		GridCellRenderer<BeanModel> estado = new GridCellRenderer<BeanModel>() {
			@Override
			public Object render(BeanModel model, String property,
					ColumnData config, int rowIndex, int colIndex,
					ListStore<BeanModel> store, Grid<BeanModel> grid) {

				String val = (String) model.get(property);
				double saldoanterior = (Double) model.get("saldoanterior");
				String style = "";
				if (val.equals("Cancelado"))
					style = "red";
				if (val.equals("Pendiente"))
					style = "green";
				if (val.equals("Iniciado"))
					style = "blue";

				if (saldoanterior == 0)
					style = "blue";
				if (saldoanterior > 0)
					style = "red";

				return "<span qtitle='"
						+ cm.getColumnById(property).getHeader() + "' qtip='"
						+ val + "' style='font-weight: bold;color:" + style
						+ "'>" + val + "</span>";
			}
		};

		column = new ColumnConfig("estado", k.estadocontrato(), 100);
		column.setAlignment(HorizontalAlignment.RIGHT);
		column.setRenderer(estado);

		// columns.add(column);

		cm = new ColumnModel(columns);

		grid = new Grid<BeanModel>(PagoSueldos.store, cm);
		grid.setAutoExpandColumn("empleado");
		grid.setLoadMask(true);
		grid.setBorders(true);
		grid.addPlugin(sm);
		grid.addPlugin(filters);
		grid.setSelectionModel(sm);
		grid.addListener(Events.Attach, new Listener<GridEvent<BeanModel>>() {
			@Override
			public void handleEvent(GridEvent<BeanModel> be) {
				PagoSueldos.loader.load(0, Utilities.itemsPerPage);
			}
		});

		grid.getSelectionModel().addListener(Events.SelectionChange,
				new Listener<SelectionChangedEvent<BeanModel>>() {

					@Override
					public void handleEvent(SelectionChangedEvent<BeanModel> be) {
						selectedSize = be.getSelection().size();

						if (selectedSize == 0) {

							panelnuevopagosueldo.unbind();

							PagoAdelantos.store.removeAll();
							panelnuevopagoadelanto.setHabilitar(false);

						} else if (selectedSize == 1) {
							selectedModel = be.getSelectedItem();
							panelnuevopagoadelanto.setHabilitar(true);
							Integer periodo = selectedModel.get("periodo");
							Integer contrato_id = selectedModel.get("contrato_id");
							PagoIngresos.contrato_id = contrato_id;
							PagoAdelantos.periodo = periodo;
							PagoAdelantos.contrato_id = contrato_id;
							PagoAdelantos.loader.load();
							PagoSueldos.contrato_id = contrato_id;
							PagoSueldos.periodo = periodo;
							PagoIngresos.periodo = selectedModel.get("periodo");

							panelnuevopagosueldo.bind(selectedModel);

						} else if (selectedSize > 1) {

							selectedModels = be.getSelection();
							PagoAdelantos.store.removeAll();
							panelnuevopagoadelanto.setHabilitar(false);
							panelnuevopagosueldo.unbind();
						}

					}

				});

		setTopComponent(toolbar);
		setBottomComponent(toolBarPag);

		add(grid);

	}

}
